package com.booksystem.campuslibrarymanagementsystem.controller.admin;

import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.FeesBacksManagement.Feedbackist;
import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.FeesBacksManagement.Feedbackstateupdate;
import com.booksystem.campuslibrarymanagementsystem.commen.result.Result;
import com.booksystem.campuslibrarymanagementsystem.commen.result.Verifys;
import com.booksystem.campuslibrarymanagementsystem.commen.result.adminresult.FeesBacksManagementR.FeedbackistR;
import com.booksystem.campuslibrarymanagementsystem.entity.AccountTable;
import com.booksystem.campuslibrarymanagementsystem.entity.FeedbacksTable;
import com.booksystem.campuslibrarymanagementsystem.service.AccountTableService;
import com.booksystem.campuslibrarymanagementsystem.service.FeedbacksTableService;
import com.booksystem.campuslibrarymanagementsystem.utils.AuditUtil;
import com.booksystem.campuslibrarymanagementsystem.utils.JwtUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/Admin")
@Api(tags = "反馈管理")
public class FeesBacksManagementController {
    private final String idt = "admin";
    Verifys verifys = new Verifys();
    AccountTable accountTable = new AccountTable();
    FeedbacksTable feedbacksTable = new FeedbacksTable();
    @Autowired
    private FeedbacksTableService feedbacksTableService;
    @Autowired
    private AccountTableService accountTableService;

    /**
     * 1.反馈列表。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Feedbackist（token）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：
     * ArrayList<FeedbackistR> list1 = new ArrayList<>();
     * 初始化一个空的ArrayList<FeedbackistR>类型的列表list1，用于存储处理后的反馈信息。
     * 遍历查询结果：
     * for (int i = 0; i < list.size(); i++) {
     * 遍历查询结果列表list中的每一项。
     * 创建并填充FeedbackistR对象：
     * 对于每个FeedbacksTable对象：
     * 创建一个新的FeedbackistR对象。
     * 从FeedbacksTable对象中获取各个属性，并设置到FeedbackistR对象中。
     * 设置FeedbackistR的属性包括id、account、content、time、state和accountid。
     * 查询账户名称：
     * 根据account字段查询账户信息：
     * AccountTable Table = accountTableService.queryByAccount(feedbacksTable.getAccount());
     * 使用accountTableService查询与account字段匹配的账户信息。
     * 设置FeedbackistR的accountname属性为查询到的账户名称。
     * 处理反馈状态：
     * 如果反馈的状态为“已处理”：
     * 再次查询账户信息，这次使用accountid：
     * AccountTable Table1 = accountTableService.queryByAccount(feedbacksTable.getAccountid());
     * 使用accountTableService查询与accountid字段匹配的账户信息。
     * 设置FeedbackistR的accountidname属性为查询到的账户名称。
     * 如果反馈的状态不是“已处理”，则：
     * 设置FeedbackistR的accountidname属性为空字符串。
     * 添加到结果列表：
     * 将填充好的FeedbackistR对象添加到结果列表list1中。
     * 返回结果：
     * 当所有查询结果都被处理后，使用Result.success方法返回成功的结果，其中包含处理后的FeedbackistR对象列表及其大小
     */
    @PostMapping("/feedbackList")
    @ApiOperation(value = "反馈列表", notes = "反馈信息列表")
    public Result<List<FeedbackistR>> feedbackList(@RequestBody Feedbackist feedbackist) {
        verifys = AuditUtil.verifyUtil(feedbackist.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                List<FeedbacksTable> list = feedbacksTableService.list();
                if (!list.isEmpty()) {
                    ArrayList<FeedbackistR> list1 = new ArrayList<>();
                    for (int i = 0; i < list.size(); i++) {
                        feedbacksTable = list.get(i);
                        FeedbackistR feedbackistR = new FeedbackistR();
                        feedbackistR.setId(feedbacksTable.getId());
                        feedbackistR.setAccount(feedbacksTable.getAccount());
                        feedbackistR.setContent(feedbacksTable.getContent());
                        feedbackistR.setTime(feedbacksTable.getTime());
                        feedbackistR.setState(feedbacksTable.getState());
                        feedbackistR.setAccountid(feedbacksTable.getAccountid());
                        AccountTable Table = accountTableService.queryByAccount(feedbacksTable.getAccount());
                        feedbackistR.setAccountname(Table.getName());
                        if (feedbacksTable.getState().equals("已处理")) {
                            AccountTable Table1 = accountTableService.queryByAccount(feedbacksTable.getAccountid());
                            feedbackistR.setAccountidname(Table1.getName());
                        } else {
                            feedbackistR.setAccountidname("");
                        }
                        list1.add(feedbackistR);
                    }
                    System.out.println("反馈列表发送成功");
                    return Result.success(list1, list1.size());
                } else {
                    return Result.fail("没有反馈");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

    /**
     * 2.未处理反馈列表。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Feedbackist（token）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：查询到所有数据
     * 6.将数据进行筛除保留状态为未处理的数据到list1中
     * 7.发送list1到前端
     */
    @PostMapping("/notFeedbackList")
    @ApiOperation(value = "未处理反馈列表", notes = "未处理反馈信息列表")
    public Result<List<FeedbackistR>> notFeedbackList(@RequestBody Feedbackist feedbackist) {
        verifys = AuditUtil.verifyUtil(feedbackist.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                List<FeedbacksTable> list = feedbacksTableService.list();
                if (!list.isEmpty()) {
                    ArrayList<FeedbackistR> list1 = new ArrayList<>();
                    for (int i = 0; i < list.size(); i++) {
                        feedbacksTable = list.get(i);
                        if (feedbacksTable.getState().equals("未处理")) {
                            FeedbackistR feedbackistR = new FeedbackistR();
                            feedbackistR.setId(feedbacksTable.getId());
                            feedbackistR.setAccount(feedbacksTable.getAccount());
                            feedbackistR.setContent(feedbacksTable.getContent());
                            feedbackistR.setTime(feedbacksTable.getTime());
                            feedbackistR.setState(feedbacksTable.getState());
                            feedbackistR.setAccountid(feedbacksTable.getAccountid());
                            AccountTable Table = accountTableService.queryByAccount(feedbacksTable.getAccount());
                            feedbackistR.setAccountname(Table.getName());
                            feedbackistR.setAccountidname("");
                            list1.add(feedbackistR);
                        }
                    }
                    System.out.println("未处理反馈列表发送成功");
                    return Result.success(list1, list1.size());
                } else {
                    return Result.fail("没有反馈");
                }

            default:
                return Result.fail(verifys.getMsg());
        }


    }

    /**
     * 3.已处理反馈列表。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Feedbackist（token）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：查询到所有数据
     * 6.将数据进行筛除保留状态为已处理的数据到list1中
     * 7.发送list1到前端
     */
    @PostMapping("/yesFeedbackList")
    @ApiOperation(value = "已处理反馈列表", notes = "已处理反馈信息列表")
    public Result<List<FeedbackistR>> yesFeedbackList(@RequestBody Feedbackist feedbackist) {
        verifys = AuditUtil.verifyUtil(feedbackist.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                List<FeedbacksTable> list = feedbacksTableService.list();
                if (!list.isEmpty()) {
                    ArrayList<FeedbackistR> list1 = new ArrayList<>();
                    for (int i = 0; i < list.size(); i++) {
                        feedbacksTable = list.get(i);
                        if (feedbacksTable.getState().equals("已处理")) {
                            FeedbackistR feedbackistR = new FeedbackistR();
                            feedbackistR.setId(feedbacksTable.getId());
                            feedbackistR.setAccount(feedbacksTable.getAccount());
                            feedbackistR.setContent(feedbacksTable.getContent());
                            feedbackistR.setTime(feedbacksTable.getTime());
                            feedbackistR.setState(feedbacksTable.getState());
                            feedbackistR.setAccountid(feedbacksTable.getAccountid());
                            AccountTable Table = accountTableService.queryByAccount(feedbacksTable.getAccount());
                            feedbackistR.setAccountname(Table.getName());
                            AccountTable Table1 = accountTableService.queryByAccount(feedbacksTable.getAccountid());
                            feedbackistR.setAccountidname(Table1.getName());
                            list1.add(feedbackistR);
                        }
                    }
                    System.out.println("已处理反馈列表发送成功");
                    return Result.success(list1, list1.size());
                } else {
                    return Result.fail("没有反馈");
                }
            default:
                return Result.fail(verifys.getMsg());
        }

    }

    /**
     * 4.处理反馈。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Categoryadd（token，categoryname）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：
     * 通过ID查询现有的反馈信息：
     * feedbacksTable = feedbacksTableService.queryById(feedbackstateupdate.getId());
     * 这一行是通过提供的反馈ID来查询数据库中是否存在该反馈信息。
     * 检查反馈信息是否存在：
     * 如果查询结果不为空（即找到了该反馈信息）：
     * 进行下一步操作。
     * 如果查询结果为空（即没有找到该反馈信息）：
     * 返回错误信息，“没有id为feedbackstateupdate.getId()的反馈信息”。
     * 检查反馈信息的状态：
     * 如果反馈信息的状态为“未处理”：
     * 更新反馈信息的状态为“已处理”，并将处理人设为当前登录用户的账号（account）。
     * boolean a = feedbacksTableService.upDataState(feedbackstateupdate.getId(), (String) account, "已处理");
     * 如果更新成功（a为true），则返回成功信息，“处理成功”。
     * 如果更新失败（a为false），则返回错误信息，“处理失败”。
     * 如果反馈信息的状态为“已处理”：
     * 更新反馈信息的状态为“未处理”，并清空处理人信息。
     * boolean a = feedbacksTableService.upDataState(feedbackstateupdate.getId(), "", "未处理");
     * 如果更新成功（a为true），则返回成功信息，“处理成功”。
     * 如果更新失败（a为false），则返回错误信息，“处理失败”。
     * 如果反馈信息的状态既不是“未处理”也不是“已处理”：
     * 返回错误信息，“该反馈信息状态异常”。
     * 返回结果：
     * 如果一切正常，返回处理结果信息（成功或失败）。
     */
    @PostMapping("/FeedbackStateUpdate")
    @ApiOperation(value = "处理反馈", notes = "处理反馈信息")
    public Result FeedbackStateUpdate(@RequestBody Feedbackstateupdate feedbackstateupdate) {
        verifys = AuditUtil.verifyUtil(feedbackstateupdate.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                feedbacksTable = feedbacksTableService.queryById(feedbackstateupdate.getId());
                if (feedbacksTable != null) {
                    if (feedbacksTable.getState().equals("未处理")) {
                        boolean a = feedbacksTableService.upDataState(feedbackstateupdate.getId(), verifys.getAccountTable().getAccount(), "已处理");
                        if (a) {
                            return Result.success("处理成功", 1);
                        } else {
                            return Result.fail("处理失败");
                        }
                    } else if (feedbacksTable.getState().equals("已处理")) {
                        boolean a = feedbacksTableService.upDataState(feedbackstateupdate.getId(), "", "未处理");
                        if (a) {
                            System.out.println(feedbackstateupdate.getId() + "反馈处理成功");
                            return Result.success("处理成功", 1);
                        } else {
                            return Result.fail("处理失败");
                        }
                    } else {
                        return Result.fail("该反馈信息状态异常");
                    }

                } else {
                    return Result.fail("没有id为" + feedbackstateupdate.getId() + "的反馈信息");
                }

            default:
                return Result.fail(verifys.getMsg());
        }

    }
}

